from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client
from django.conf import settings


@deconstructible   # 需要导入这个装饰器,对类进行装饰,类才能真正的生效,
class FastDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):

        if client_conf is None:   # 如果别人调用的时候,没有传递来数据 ,走下面
            client_conf = settings.FDFS_CLIENT_CONF  # 1在settings下,进行路径的编写,在这里使用 ,
        self.client_conf = client_conf  # 如果传递过来值,走这个,


        if base_url is None:  # 配置域名
            base_url = settings.FDFS_URL
        self.base_url = base_url




    def _open(self, name, mode='rb'):  # 如此定义一下open方法就行了,因为重写了类,但是此方法并不需要重写,所以pass就行了,

        pass



    def _save(self, name, content):  #重写save方法,他就是保存文件的方法,

        client = Fdfs_client(self.client_conf)  # 2,在此使用
        res = client.upload_by_buffer(content.read()) # content.read()就是二进制数据,用upload_by_buffer上传二进制数据 ,

        if res['Status'] != 'Upload successed.':
            raise Exception('upload error')
        file_id_name = res['Remote file_id']  # 取路径

        return file_id_name   # 此时,保存路径就指定到了fastDFS系统当中了,不再保存到当前路径中了 ,



    def url(self, name):
        # name接受_save（）返回值
        return self.base_url + name #返回图片保存的链接地址,这个地址要存在数据库中,这是域名加图片url



    def exists(self, name): # 判断文件是否重复保存le,这里直接返回false ,因为不需要手写判断,因为fastdfs自己会判断,
        return False
